// Package apiserver does all the work necessary to create a iam APIServer.
package apiserver

import (
	"gitee.com/han-jiahao666/iam/internal/apiserver/options"
	"github.com/marmotedu/iam/pkg/app"
	"github.com/marmotedu/iam/pkg/log"
)

// commandDesc 是 IAM API 服务器的描述信息，包括其功能和更多信息的链接。
const commandDesc = `IAM API 服务器负责验证和配置数据，
这些数据是针对包括用户、策略、密钥等在内的 API 对象的。
API 服务器提供 REST 操作来进行 API 对象的管理。

有关 iam-apiserver 的更多信息，请参考：
    https://github.com/marmotedu/iam/blob/master/docs/guide/en-US/cmd/iam-apiserver.md`

// NewApp 函数用于创建一个带有默认参数的 App 对象。
func NewApp(basename string) *app.App {
	// 初始化选项
	opts := options.NewOptions()
	// 创建一个新的 App 实例，设置其名称、基本名称、选项、描述、默认有效参数和运行函数
	application := app.NewApp("IAM API Server",
		basename,
		app.WithOptions(opts),
		app.WithDescription(commandDesc),
		app.WithDefaultValidArgs(),
		app.WithRunFunc(run(opts)),
	)

	return application
}

// run 函数返回一个 app.RunFunc 类型的函数，该函数用于运行 IAM API 服务器。
func run(opts *options.Options) app.RunFunc {
	return func(basename string) error {
		// 初始化日志
		log.Init(opts.Log)
		// 确保在函数返回前刷新日志
		defer log.Flush()

		// 从选项中创建配置
		cfg, err := config.CreateConfigFromOptions(opts)
		if err != nil {
			return err
		}

		// 运行服务器
		return Run(cfg)
	}
}
